package com.zmz.lambda;

import java.util.function.BiFunction;
import java.util.function.ToIntBiFunction;

/**
 * Create with IntelliT IDEA
 *
 * @Author: zhengmingzhe
 * @Date: 2022/07/30/18:03
 * @Description:  Lambda表达式简化的写法(实现接口调用类的方法)
 */
public class Lambda02 {

    /*
     * @Description  这是一个静态方法
     * @Param
     * @return
     **/
    public static  int num(int n){
        return n+100;
    }
    /*
     * @Description 这是一个成员方法，也是一个实例方法
     * @Param
     * @return
     **/
    public int row(int a){
        return a+200;
    }



    public static void main(String[] args){
        //使用有一个参数,并带返回值(输出结果是20)
        ReturnOneParam returnOneParam = (a)->  a+10;
        System.out.println(returnOneParam.method(10));

        //使用有一个参数,并带返回值(输出结果是120) 调用本类静态方法直接调用
        ReturnOneParam returnOneParam0 = (a)->num(a);
        System.out.println(returnOneParam0.method(20));

        //使用有一个参数,并带返回值(输出结果是120) 调用某个类的静态方法格式如下 不需要箭头(此格式只支持方法不支持成员属性)
        ReturnOneParam returnOneParam1 = Lambda02::num;
        System.out.println(returnOneParam1.method(20));

        //使用有一个参数,并带返回值(输出结果是202)调用其他类或者本类的成员方法的另一种写法(其实就是实现了接口里的抽象方法)
        ReturnOneParam returnOneParam2 = (int b)->{
            return new Lambda02().row(b);};
        System.out.println(returnOneParam2.method( 2));
        //使用有一个参数,并带返回值(输出结果是201)因为row方法也属于实例方法 ，也可以用 对象::实例方法 方式调用
        Lambda02 lambda = new Lambda02();
        ReturnOneParam returnOneParam3 =  lambda::row;
        System.out.println(returnOneParam2.method(1));

        //使用有一个参数,并带返回值(输出结果是202)因为row方法也属于实例方法 ，也可以用 类名::实例方法 方式调用(目前测试该实例方法只允许一个参数一个返回值)
        //特殊实例方法引用 第一个参数是类名 第二个参数是传入的值  第三个参数是返回值
        /*
            public interface BiFunction<T, U, R> {
                R apply(T t, U u);
        */
         BiFunction<Lambda02, Integer, Integer> row = Lambda02::row;
         System.out.println(returnOneParam2.method(2));

    }



}
